/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package analiseSintatica.Regras.Expressoes;

import AnaliseLexicaFinal.EstruturaDeDados.LinkToken;
import analiseSintatica.ErroSintaticoException;
import analiseSintatica.Regras.Regra;
import analiseSintatica.estruturadados.NoArvore;

import java.util.LinkedList;

/**
 *
 * @author matheus
 */
public class RegraOpUnario extends Regra{

    protected static Regra instancia;
    protected String estrutura = "'&' | '*' | <op_adicao>";
    
    /**
     * Construtor privado necessario ao singleton
     */
    private RegraOpUnario() {
    }

    /**
     * Retorna a unica instancia dessa classe.
     * @return
     */
    public static RegraOpUnario getInstance() {
        if (instancia == null) {
            instancia = new RegraOpUnario();
        }
        return (RegraOpUnario) instancia;
    }

    @Override
    public NoArvore analisar(LinkedList<LinkToken> listaTokens) throws ErroSintaticoException {
         NoArvore naoterminaoOpUnario = new NoArvore("<op_unário>", false);

          if(listaTokens.getFirst().getToken().equals("&")){
             naoterminaoOpUnario.adicionaFilho(reconhecerOpUnario(listaTokens));

            }
          else{

            naoterminaoOpUnario.adicionaFilho(reconhecerOpUnarioasterisco(listaTokens));

            }
        


        return naoterminaoOpUnario;
    }

     /**
     * Reconhece terminal "&"
     * @param tokens - Tokens do codigo
     * @return - Sub-arvore sintatica
     */
    public NoArvore reconhecerOpUnario(LinkedList<LinkToken> tokens) {
        tokens.removeFirst();
        return new NoArvore("&", true);
    }

     /**
     * Reconhece terminal "++"
     * @param tokens - Tokens do codigo
     * @return - Sub-arvore sintatica
     */
    public NoArvore reconhecerOpUnarioasterisco(LinkedList<LinkToken> tokens) {
        tokens.removeFirst();
        return new NoArvore("*", true);
    }


    @Override
    protected void setPrimeiro() {
        //P(op_unario) = { '&', '*' }
         this.primeiro.add("&");
         this.primeiro.add("*");
         
       
    }

    @Override
    protected void setSeguinte() {
        seguinte.add("identificador");
    }

}
